home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Transmission / whiteline CD Series - Transmission.iso / utilitys / gamefix / mini1.c < prev    next >
C/C++ Source or Header  |  1995-06-07  |  4KB  |  125 lines

  1. /***********************************************/
  2. /* Modulname      : MINI1.C                    */
  3. /* Autor          : Thomas Binder              */
  4. /* Zweck:         : Miniprogramm, das aus      */
  5. /*                  GAMEFIX heraus gespeichert */
  6. /*                  werden kann und wie "OK/   */
  7. /*                  Booten" wirkt, also einen  */
  8. /*                  "Magic Pack" im Speicher   */
  9. /*                  anlegt und dann einen      */
  10. /*                  Reset auslöst.             */
  11. /* Compiler       : Pure C 1.0                 */
  12. /* Erstellt am    : 28.08.1993                 */
  13. /* Letzte Änderung: 03.09.1993                 */
  14. /***********************************************/
  15.  
  16. #include <tos.h>
  17. #include <portab.h>
  18. #include <falcon.h>
  19. #include "gamefix.h"
  20.  
  21. /* Prototypen */
  22. LONG reset(void);
  23. LONG get_ram(void);
  24.  
  25. /* Globale Variablen */
  26. extern WORD mtype;
  27. WORD magic_pack[1280];
  28.  
  29. void main(void)
  30. {
  31.     WORD    i, j,
  32.             sum,
  33.             first,
  34.             checkpos,
  35.             pos;
  36.     LONG    help;
  37.     ULONG   ram;
  38.     
  39.     /* Ramgrö₧e des F030 bestimmen */
  40.     ram = (ULONG)Supexec(get_ram);
  41.     /* Monitortyp auslesen */
  42.     mtype = mon_type();
  43.     /* Startadresse der GEMDOS-Routine für */
  44.     /* die alte Bildschirmadresse und des */
  45.     /* PMMU-Baums bestimmen */
  46.     if (ramsizes[settings[_RAMCONFIG]] == ram)
  47.     {
  48.         gdrout = (WORD *)0x600L;
  49.         rootpointer[1] = 0x700L;
  50.         if (!Super((void *)1L))
  51.             Super(0L);
  52.     }
  53.     else
  54.     {
  55.         gdrout = (WORD *)(ram - 256LU);
  56.         rootpointer[1] = ram - 512LU;
  57.     }
  58.     /* PMMU-Baum kopieren */
  59.     for (i = 0; i < 64; i++)
  60.     {
  61.         if ((new_pmmu_tree[i] / 65536LU) ==
  62.             0xffffLU)
  63.         {
  64.             /* Bei entsprechend gekennzeich- */
  65.             /* netem Eintrag den richtigen */
  66.             /* Offset berechnen */
  67.             new_pmmu_tree[i] =
  68.                 rootpointer[1] +
  69.                 (new_pmmu_tree[i] & 65535LU);
  70.         }
  71.         else
  72.         {
  73.             /* Sollen Daten- und Befehlscache */
  74.             /* ausgeschaltet werden, im PMMU- */
  75.             /* Baum Cache-Inhibit-Flag setzen */
  76.             if (!settings[_DATACACHE] &&
  77.                 !settings[_INSTCACHE])
  78.             {
  79.                 new_pmmu_tree[i] |= 64LU;
  80.             }
  81.         }
  82.         ((LONG *)rootpointer[1])[i] =
  83.             new_pmmu_tree[i];
  84.     }
  85.     /* GEMDOS-Routine kopieren (egal, ob sie */
  86.     /* gebraucht wird, oder nicht */
  87.     for (i = 0; _gemdos[i] != (WORD)0xabcd; i++)
  88.         gdrout[i] = _gemdos[i];
  89.     gdrout += 6L;
  90.     help = (LONG)magic_pack;
  91.     /* Beginn des Magic Pack bestimmen (mu₧ */
  92.     /* auf 512-Byte-Grenze fallen). Die Magic */
  93.     /* Packs sind übrigens offiziell nicht */
  94.     /* dokumentiert, sie sollten also nur sehr */
  95.     /* selten benutzt werden */
  96.     if (help % 512L)
  97.         help += 512L - (help % 512L);
  98.     first = pos = (WORD)((help -
  99.         (LONG)magic_pack) / 2L);
  100.     /* Erster Long-Wert im Magic Pack mu₧ */
  101.     /* 0x12123456 sein */
  102.     magic_pack[pos++] = 0x1212;
  103.     magic_pack[pos++] = 0x3456;
  104.     /* Im zweiten Long-Wert mu₧ die */
  105.     /* Anfangsadresse des Packs stehen */
  106.     magic_pack[pos++] = (WORD)(help >> 16);
  107.     magic_pack[pos++] = (WORD)(help & 65535L);
  108.     /* Assembler-Routine kopieren */
  109.     for (i = 0; mpack[i] != (WORD)0xabcd; i++)
  110.         magic_pack[pos + i] = mpack[i];
  111.     /* 16-Bit-Prüfsumme über den Magic Pack */
  112.     /* bilden */
  113.     for (j = sum = 0; j < 256; sum +=
  114.         magic_pack[first + j++]);
  115.     /* Checksumme so ändern, da₧ die */
  116.     /* Prüfsumme 0x5678 ergibt (sonst wird */
  117.     /* der Magic Pack nicht ausgeführt) */
  118.     checkpos = (pos << 1) +
  119.         (WORD)((LONG)&checksum - (LONG)mpack);
  120.     magic_pack[checkpos >> 1] += (0x5678 - sum);
  121.     /* Reset auslösen */
  122.     Supexec(reset);
  123. }
  124. /* Modulende */
  125.